package com.yunxin.mybatisplus.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.yunxin.mybatisplus.bean.DecimalSerializeProperties;
import com.yunxin.mybatisplus.utils.datahandler.DecimalSerializer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import java.math.BigDecimal;
import java.util.Date;

/**
 * Description:
 *
 * @Author sbx
 * @Create 2025/9/8 13:32
 */
@Configuration
public class WebConfig {

    @Autowired
    private DecimalSerializeProperties decimalProperties;

    @Bean
    @Primary
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();

        // 创建模块并注册核心序列化器
        SimpleModule decimalModule = new SimpleModule();

        // 创建一个使用全局默认配置的 DecimalSerializer 作为基础
        DecimalSerializer defaultSerializer = new DecimalSerializer(
                decimalProperties.getDefaultScale(),
                decimalProperties.getRoundingMode(),
                decimalProperties.getDateFormat(),
                decimalProperties.getTimeZone()
        );

        // 只注册需要特殊处理的类型
        // BigDecimal 是核心目标
        decimalModule.addSerializer(BigDecimal.class, defaultSerializer);
        // 对于 Double/Float，通常也期望控制精度
        decimalModule.addSerializer(Double.class, defaultSerializer);
        decimalModule.addSerializer(Float.class, defaultSerializer);
        decimalModule.addSerializer(double.class, defaultSerializer);
        decimalModule.addSerializer(float.class, defaultSerializer);
        decimalModule.addSerializer(Long.class, defaultSerializer);
        decimalModule.addSerializer(long.class, defaultSerializer);
        // Date 类型
        decimalModule.addSerializer(Date.class, defaultSerializer);

        mapper.registerModule(decimalModule);

        // 关键配置：关闭将 Date 序列化为时间戳
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

        // 可选：根据需要添加其他配置，例如缩进输出（生产环境通常关闭）
        // mapper.configure(SerializationFeature.INDENT_OUTPUT, true);

        return mapper;
    }
}
